import numpy as np
import argparse
import cv2
import os
# 命令行命令：python .\cv2Usage.py --file e:\pythonFile\PythonFile\usingFile\moduleUsage\cv2Usage\60960684.png


def basic_using(file):
    # 读取图片
    # 彩色读取
    img = cv2.imread(file, cv2.IMREAD_COLOR)
    img1 = cv2.imread(file, 1)
    # 灰度读取
    img2 = cv2.imread(file, 0)
    img3 = cv2.imread(file, cv2.IMREAD_GRAYSCALE)

    # 展示图片
    cv2.imshow('image_show', img1)
    cv2.waitKey(0)  # 0一直显示，直到有键盘输入。也可以是其他数字，毫秒级
    # 保存图片
    cv2.imwrite('picture.jpg', img)

    # 添加文字
    new_img = cv2.putText(
        img=img1,
        text="Daniel",  # 文本
        org=(0, 50),  # 字体开始写的左上角位置
        fontFace=cv2.FONT_HERSHEY_SIMPLEX,  # 字体
        fontScale=1,  # 字体大小
        color=(255, 0, 0),  # 颜色
        thickness=2  # 字体粗细
    )
    # 颜色转换：cv2.COLOR_X2Y 其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
    Color_image = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)

    # 复制图片
    new_img = img1.copy()

    # 翻转图片,0,1,-1
    new_img = cv2.flip(img1, flipCode=1)
    cv2.imshow('image_show', new_img)
    cv2.waitKey(0)

    # 显示窗口创建与销毁:
    # cv2.namedWindow(窗口名，属性) 创建一个窗口
    # 属性—指定窗口大小模式：
    # cv2.WINDOW_AUTOSIZE：根据图像大小自动创建大小
    # cv2.WINDOW_NORMAL：窗口大小可调整
    # cv2.destoryAllWindows(窗口名) 删除任何建立的窗口
    cv2.namedWindow('picture_show', cv2.WINDOW_NORMAL)
    cv2.imshow('picture_show', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # img.shape 返回图像高（图像矩阵的行数）、宽（图像矩阵的列数）和通道数3个属性组成的元组，若图像是非彩色图，则只返回高和宽组成的元组。
    sp1 = img.shape
    print(sp1)

    # 图像像素总数目和图像数据类型的获取
    imgSize = img.size
    imgType = img.dtype
    print(imgSize, imgType)


def basic_using1(file):
    img = cv2.imread(file)
    # 生成指定大小的空图像
    imgZero = np.zeros(img.shape, np.uint8)
    imgFix = np.zeros((300, 500, 3), np.uint8)
    # cv2.imshow('imgZero', imgZero)
    # cv2.imshow('imgFix', imgFix)
    # cv2.waitKey(0)

    # 图像三通道分离和合并
    b, g, r = cv2.split(img)
    # b = cv2.split(img)[0]
    # g = cv2.split(img)[1]
    # r = cv2.split(img)[2]
    merged = cv2.merge([b, g, r])
    cv2.imshow("Blue", b)
    cv2.imshow("Green", g)
    cv2.imshow("Red", r)
    cv2.imshow("Merged", merged)
    cv2.waitKey()

    # 图像缩放:resize函数里的size第一个是宽（列），第二个是高（行）
    imgg = cv2.resize(img, (200, 100))
    cv2.imshow('imgg', imgg)
    cv2.waitKey(0)

    # 截取图片
    y = 100
    x = 120
    h = 700
    w = 800
    cropImg = img[y:y+h, x:x+w]
    cv2.imshow('cropped', cropImg)
    cv2.imwrite('cropImg.jpg', cropImg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    paser = argparse.ArgumentParser(
        description="Draw picture"
    )
    paser.add_argument('--file', type=str, required=True)  # required=True必须填参数
    paser.add_argument('-c', "--color", type=int, default=32)
    args = paser.parse_args()
    filename = args.file
    colorNumber = args.color
    print('命令行参数：', filename)
    print('命令行参数：', colorNumber)

    # os.path.splitext(filePath)分离文件名与扩展名
    print(os.path.splitext(filename))
    print(os.path.splitext(filename)[1].lower())
    # os.path.split(filePath)最后一个 / 或 \ 作为分隔，切成一个元组。他并不会判断你给他的东西里面到底有没有文件名或者路径
    print(os.path.split(filename))
    file = os.path.split(filename)[1].lower()

    basic_using(file)

    basic_using1(file)
